package com.timemetro.app.stationObject;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;

import java.util.List;

/**
 * Created by localadmin on 18.05.2015.
 */
public class Station {



    protected TypeStation typeStation;
    public TypeStation getTypeStation() {
        return typeStation;
    }

    protected StatusStation statusStation;
    public StatusStation getStatusStation() {
        return statusStation;
    }
    public void setStatusStation(StatusStation statusStation) {
        this.statusStation = statusStation;
    }

    private int idStation;
    public int getIdStation() {
        return idStation;
    }
    public void setIdStation(int idStation) {
        this.idStation = idStation;
    }

    private int idBranch;
    public int getIdBranch() {
        return idBranch;
    }
    public void setIdBranch(int idBranch) {
        this.idBranch = idBranch;
    }



    private String name;                    // Название станции;
    public String getName() {
        return name;
    }

    private int color;                      // Цвет станции;
    public int getColor() {
        return color;
    }

    private int colorActive;                      // Цвет выбранной станции;
    public int getColorActive() {
        return colorActive;
    }

    private float positionX;                // Координаты станции (X, Y) в натуральном масштабе;
    public float getPositionX() {
        return positionX;
    }
    public void setPositionX(float positionX) {
        this.positionX = positionX;
    }

    private float positionY;
    public float getPositionY() {
        return positionY;
    }
    public void setPositionY(float positionY) {
        this.positionY = positionY;
    }

    private float realPositionX;            // Координаты станции в масштабе matrix (матрица преобразования сцены);
    private float realPositionY;

    private float touchPositionX;           // Координаты прикосновения (X, Y) в натуральном масштабе;
    private float touchPositionY;

    private float sensitivityTouch = 13;    // Радиус чувствительности реагирования на выбор станции в натуральном и преобразованном масштабе;
    private float raalSensitivitTouch;

    private float radiusStation = 13;       // Радиус станции в натуральном масштабе;
    private float thicknessBoard = 2;



    private float timeUntilNextStation;                   // Время до следующей станции;
    public float getTimeUntilNextStation() {
        return timeUntilNextStation;
    }

    private Matrix matrix;                  // Матрица преобразования главной сцены.

    private List<InfoNextStation> infoNextNodeList;
    public List<InfoNextStation> getInfoNextNodeList() {
        return infoNextNodeList;
    }

    public Station(){
    }
    public Station(int idStation, int idBranch, String name, float timeUntilNextStation, float positionX, float positionY){
        this.name = name;

        if (idBranch == 1) this.color = Color.GREEN;
        if (idBranch == 4) this.color = Color.BLUE;
        if (idBranch == 5) this.color = Color.YELLOW;
        if (idBranch == 0) this.color = Color.MAGENTA;
        if (idBranch == 1) this.color = Color.LTGRAY;
        this.colorActive = Color.RED;

        this.idStation = idStation;
        this.idBranch = idBranch;
        this.positionX = positionX;
        this.positionY = positionY;
        this.statusStation = StatusStation.normal;
        this.timeUntilNextStation = timeUntilNextStation;
    }
    public Station(int idBranch, int idStation, String name, float timeUntilNextStation, float positionX, float positionY, TypeStation typeStation, List<InfoNextStation> infoNextStationList){
        this(idBranch, idStation,name,timeUntilNextStation, positionX,positionY);
        this.typeStation = typeStation;
        this.infoNextNodeList = infoNextStationList;
    }

    public boolean isActiveStation(){
        if(statusStation == StatusStation.beginStation || statusStation == StatusStation.endStation || statusStation == StatusStation.branchStation){
            return true;
        }
        return false;
    }


    public void Draw(Canvas canvas, Matrix matrix) {
        Paint paintGrayBorder = new Paint(Paint.ANTI_ALIAS_FLAG);
        paintGrayBorder.setStyle(Paint.Style.STROKE);
        paintGrayBorder.setStrokeWidth(2);
        paintGrayBorder.setShadowLayer(2, 2, 2, Color.GRAY);

        Paint interiorOval = new Paint(Paint.ANTI_ALIAS_FLAG);
        interiorOval.setStyle(Paint.Style.FILL);
        interiorOval.setStrokeMiter(2);

        Paint text = new Paint(Paint.ANTI_ALIAS_FLAG);
        text.setStyle(Paint.Style.FILL);
        text.setStrokeMiter(1);
        text.setColor(Color.BLACK);

        if (statusStation == StatusStation.beginStation || statusStation == StatusStation.endStation || statusStation == StatusStation.branchStation) {
            paintGrayBorder.setColor(Color.GRAY);
            interiorOval.setColor(colorActive);
        } else{
            paintGrayBorder.setColor(Color.BLACK);
            interiorOval.setColor(color);
        }
        this.matrix = matrix;
        //canvas.drawOval(positionX - radiusStation, positionY - radiusStation, positionX + radiusStation, positionY + radiusStation, paintGrayBorder);
        canvas.drawCircle(positionX, positionY, radiusStation,paintGrayBorder);
        float interiorRadius = radiusStation - thicknessBoard;
        //canvas.drawOval(positionX - interiorRadius, positionY - interiorRadius, positionX + interiorRadius, positionY + interiorRadius, interiorOval);
        //canvas.drawOval(positionX - interiorRadius, positionY - interiorRadius, positionX + interiorRadius, positionY + interiorRadius, paintGrayBorder);
        canvas.drawCircle(positionX, positionY, interiorRadius, interiorOval);
        canvas.drawCircle(positionX, positionY, interiorRadius, paintGrayBorder);
        canvas.drawText(name, positionX + radiusStation + 2, positionY, text);
    }

    /*Функция проверки прикосновения к элементу*/
    public boolean isTouch(float touchPositionX, float touchPositionY) {
        ReadingTouchPosition(touchPositionX, touchPositionY);
        UseConversionMatrix();
        if (CheckingTouch()){
            return true;
        }
        return false;
    }

    /*Проверка прикосновения к объекту используя преобразованные координаты*/
    private boolean CheckingTouch() {
        if (Math.abs(touchPositionX - realPositionX) < raalSensitivitTouch && Math.abs(touchPositionY - realPositionY) < raalSensitivitTouch)
            return true;
        return false;
    }

    private void ReadingTouchPosition(float touchPositionX, float touchPositionY) {
        this.touchPositionX = touchPositionX;
        this.touchPositionY = touchPositionY;
    }

    /*Преобразуем координаты объекта и диаметр с помощью матрицы преобразования основной сцены*/
    private void UseConversionMatrix() {

// Преобразуем положение объекта:
        float[] pointsConversion = new float[2];
        pointsConversion[0] = positionX;
        pointsConversion[1] = positionY;
        matrix.mapPoints(pointsConversion);
        realPositionX = pointsConversion[0];
        realPositionY = pointsConversion[1];
// Преобразуем радус
        raalSensitivitTouch = matrix.mapRadius(sensitivityTouch);

    }
}
